/**
 * 给定长度为N的数组（N在3000），按如下条件挑出子序列：
 * 1. 子序列的位置在原数组中恰好是等差数列
 * 2. 元素值都相等
 * 问最长的长度是多少。
 * 令Dij是到i位置，公差为j的子序列长度
 * 则 D[i][j] = D[j][i-j] + 1 或 1
 * O(N^2)可以解决
 */
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;

using Real = long double;
using llt = long long;
using vi = vector<int>;
using vll = vector<llt>;
using pii = pair<int, int>;
using pll = pair<llt, llt>;
using i128 = __int128_t;

int N;
map<int, vi> Map;
vi A;
vector<vi> D;

void work(){
    cin >> N;
    A.assign(N + 1, 0);
    for(int a,i=1;i<=N;++i){
        cin >> a;
        Map[a].emplace_back(i);
        A[i] = a;
    }

    // int ans = 0;
    // for(const auto & p : Map){
    //     const auto & vec = p.second;
    //     ans = max(ans, proc(vec));
    // }
    // cout << ans << endl;

    int ans = 1;
    D.assign(N + 1, vi(N + 1, 0));
    for(int i=1;i<=N;++i){
        for(int j=1;j<=N;++j){
            if(j > i){
                D[i][j] = 1;
            }else{
                if(A[i] == A[i - j] or A[i - j] == 0) D[i][j] = D[i - j][j] + 1;
                else D[i][j] = 1;                
            }

            ans = max(ans, D[i][j]);
        }
    }
    cout << ans << endl;
    return;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);	
    int nofkase = 1;
	// cin >> nofkase;
	while(nofkase--) work();
	return 0;
}